import scala.actors.Actor

class Secretary(teamLeader: Actor) extends Actor {
  var teamLeaderBusy = false;

  var queueCustomers = 0;
  var queueProgrammers = 0;

  var customerList: List[Customer] = Nil;
  var programmerList: List[Programmer] = Nil;

  def act() {
    loop {
      react {
        case `requestAppointment` =>
          // Eerst controleren of een klant of programmeur aanklopt zodat we het object
          // in de juiste lijst kunnen zetten en we de juiste counter kunnen verhogen.
          if (sender.isInstanceOf[Customer]) {
            println(" = Secretary > Klant heeft om afspraak gevraagd en staat genoteerd.");
            queueCustomers += 1;

            val customer: Customer = sender.asInstanceOf[Customer];
            customerList = customer :: customerList;
          } else if (sender.isInstanceOf[Programmer]) {
            if (!teamLeaderBusy) {
              println(" = Secretary > Programmeur heeft om afspraak gevraagd en staat genoteerd.");
              queueProgrammers += 1;

              val programmer: Programmer = sender.asInstanceOf[Programmer];
              programmerList = programmer :: programmerList;
            } else {
              sender ! teamLeaderIsBusy;
            }
          }

          // Kijken of er 3 klanten of 2 programmeurs staan te wachten.
          if (!teamLeaderBusy) {
            if (queueCustomers == 3) {
              teamLeader ! notifyTeamLeader(customerList);
              customerList = List();
              queueCustomers = 0;

              teamLeaderBusy = true;

            } else if (queueProgrammers == 2) {

              teamLeader ! notifyTeamLeader(programmerList);
              programmerList = List();
              queueProgrammers = 0;

              teamLeaderBusy = true;
            }
          }
        case `teamLeaderIsFree` =>
          println(" = Secretary > Teamleader heeft niets te doen.");
          teamLeaderBusy = false;
      }
    }
  }
}

case object Secretary extends Message